<?php

class ConfrontoDAO{
	/**
	 * 
	 * @var ConfrontoDAO
	 */
	public static $instancia=null;
	/**
	 * 
	 * @var PDO
	 */
	private $conn;
	
	/**
	 * 
	 * @var PDOStatement
	 */
	private $stmt;
	
	protected function __construct(){
		$this->conn = ConexaoPDO::getInstancia()->getDb();
	}
	public static function getInstancia(){
		if(!isset(self::$instancia)){
			self::$instancia = new ConfrontoDAO();
		}
		return self::$instancia;
	}
	
	public function montarObj($dados,$comTimes = null){
		$confronto = new Confronto();
		if(isset($dados["id_confronto"]))
			$confronto->setIdConfronto($dados["id_confronto"]);
		if(isset($dados["id_time1"]))
			$confronto->setIdTime1($dados["id_time1"]);
		if(isset($dados["id_time2"]))
			$confronto->setIdTime2($dados["id_time2"]);
		if(isset($dados["id_time_vencedor"]))
			$confronto->setIdTimeVencedor($dados["id_time_vencedor"]);
		if(isset($dados["id_patrocinador"]))
			$confronto->setIdPatrocinador($dados["id_patrocinador"]);
		if(isset($dados["votos_time1"]))
			$confronto->setVotosTime1($dados["votos_time1"]);
		if(isset($dados["votos_time2"]))
			$confronto->setVotosTime2($dados["votos_time2"]);
		if(isset($dados["rodada"]))
			$confronto->setRodada($dados["rodada"]);
		if(isset($dados["data"]))
			$confronto->setData($dados["data"]);
		if(isset($dados["foto"]))
			$confronto->setFoto($dados["foto"]);
		if(isset($dados["data_inicio"]))
			$confronto->setDataInicio($dados["data_inicio"]);
		if(isset($dados["data_fim"]))
			$confronto->setDataFim($dados["data_fim"]);
		if(isset($comTimes)){
			$confronto->setTime1(TimeDAO::getInstancia()->getTime($dados["id_time1"]));
			$confronto->setTime2(TimeDAO::getInstancia()->getTime($dados["id_time2"]));
			$confronto->setTimeVencedor(TimeDAO::getInstancia()->getTime($dados["id_time_vencedor"]));
		}
		
		return $confronto;
	}
	
	public function getConfronto($idConfronto,$inArray = null){
		$sql = "SELECT * FROM confronto WHERE id_confronto = :id_confronto";
		try{
			$this->stmt = $this->conn->prepare($sql);
			$this->stmt->bindValue(":id_confronto",$idConfronto);
			$this->stmt->execute();
			$result = $this->stmt->fetch();
			if ($inArray){
				return $result;
			}else{
				return $this->montarObj($result);
			}	
			
		}catch(PDOException $e){
			throw new ConfrontoException($e->getMessage());
		}
	}
	
	public function getConfrontosByTime($idTime){
				
		$sql = "SELECT * FROM confronto WHERE id_time1 = :id_time OR id_time2 = :id_time";
		try{
			$confrontos = array();
			$this->stmt = $this->conn->prepare($sql);
			$this->stmt->bindValue(":id_time",$idTime);
			$this->stmt->execute();
			$result = $this->stmt->fetchAll();
			foreach($result as $row){
				$confrontos[] = $this->montarObj($row);
			}
			return $confrontos;
		}catch(PDOException $e){
			throw new ConfrontoException($e->getMessage());
		}
	}
	
	public function getConfrontosAbertos(){
		$sql = "SELECT * FROM confronto WHERE data_inicio < NOW() AND data_fim > NOW()";
		try{
			$confrontos = array();
			$this->stmt = $this->conn->query($sql,PDO::FETCH_ASSOC);
			$result = $this->stmt->fetchAll();
			foreach($result as $row){
				$confrontos[] = $this->montarObj($row);
			}
			return $confrontos;
		}catch(PDOException $e){
			throw new ConfrontoException($e->getMessage());
		}
	}
	
	public function getConfrontosByRodada($rodada = null){
		if(isset($rodada)){		
			$sql = "SELECT * FROM confronto WHERE rodada = :rodada";
		}else{
			$sql = "SELECT * FROM confronto ORDER BY rodada";
		}
		try{
			$confrontos = array();
			$this->stmt = $this->conn->prepare($sql);
			if(isset($rodada)){	
				$this->stmt->bindValue(":rodada",$rodada);
			}
			$this->stmt->execute();
			$result = $this->stmt->fetchAll();
			foreach($result as $row){
				$confrontos[] = $this->montarObj($row,true);
			}
			return $confrontos;
		}catch(PDOException $e){
			throw new ConfrontoException($e->getMessage());
		}
	}
	
	public function getAllConfrontos(){
		
		$sql = "SELECT (SELECT t.nome FROM time t WHERE t.id_time=c.id_time1) as nome1,
		(SELECT t.nome FROM time t WHERE t.id_time=c.id_time2) as nome2,
		(SELECT t.foto FROM time t WHERE t.id_time=c.id_time1) as foto1,
		(SELECT t.foto FROM time t WHERE t.id_time=c.id_time2) as foto2,
		votos_time1,
		votos_time2,
		rodada,
		data,
		id_confronto,
		foto
		FROM confronto c";
		
		try{
			$confrontos = array();
			$this->stmt = $this->conn->prepare($sql);
			$this->stmt->execute();
			$result = $this->stmt->fetchAll();
//			foreach($result as $row){
//				$confrontos[$row["rodada"]] = $this->montarObj($row,true);
//			}
//			return $confrontos;
			return $result;
		}catch(PDOException $e){
			throw new ConfrontoException($e->getMessage());
		}
	}
	
	public function getRodadaAtual(){
		
		$sql = "SELECT * FROM rodada_atual";
		
		try{
			$this->stmt = $this->conn->prepare($sql);
			$this->stmt->execute();
			$result = $this->stmt->fetch();			
			
			return $result[0]["rodada"];
		}catch(PDOException $e){
			throw new ConfrontoException($e->getMessage());
		}
	}
	
	public function ja_votou($idConfronto, $idUsuario){
		$sql = "SELECT * FROM `votacao` WHERE id_facebook = :id_facebook and id_confronto = :id_confronto and data > DATE_SUB(NOW(), INTERVAL 1 HOUR)";
		$sqlteste = "SELECT * FROM `votacao` WHERE id_facebook = {$idUsuario} and id_confronto = {$idConfronto} and data > DATE_SUB(NOW(), INTERVAL 1 HOUR)";
		//die($sqlteste);
		try{
			$confrontos = array();
			$this->stmt = $this->conn->prepare($sql);
			$this->stmt->bindValue(":id_confronto",$idConfronto);
			$this->stmt->bindValue(":id_facebook",$idUsuario);
			$this->stmt->execute();
			$result = $this->stmt->fetchAll();
			//var_dump($result);exit;
			if (sizeof($result) == 0){
				return false;
			}else{
				return true;
			}
			
		}catch(PDOException $e){
			throw new ConfrontoException($e->getMessage());
		}
	}
	
	public function esta_em_andamento($idConfronto){
		$sql = "SELECT * FROM confronto WHERE data_inicio < NOW() AND data_fim > NOW() AND id_confronto = :id_confronto";
		try{
			$this->stmt = $this->conn->prepare($sql);
			$this->stmt->bindValue(":id_confronto",$idConfronto);
			$this->stmt->execute();
			$result = $this->stmt->fetch();
			if ($result){
				return true;
			}else{
				return null;
			}
		}catch(PDOException $e){
			throw new ConfrontoException($e->getMessage());
		}
	}
	
	public function votar($idConfronto, $idUsuario, $idTime, $tipo) {
		
		$sql = "INSERT INTO votacao (id_confronto,id_time,id_facebook,data) VALUES (:id_confronto, :id_time, :id_facebook, NOW())";
		
		try {
			
			$this->stmt = $this->conn->prepare($sql);
			$this->stmt->bindValue(":id_confronto", $idConfronto);
			$this->stmt->bindValue(":id_time", $idTime);
			$this->stmt->bindValue(":id_facebook", $idUsuario);
			
			$param = array(':id_confronto' => $idConfronto,':id_time' => $idTime,':id_facebook' => $idUsuario);
			
			$this->stmt->execute($param);
			
			if($this->atualizarVotacaoConfronto($idConfronto, $idTime, $tipo)) return true;
			
		} catch(PDOException $e) {
			
			throw new TimeException($e->getMessage());
			
		}
	}
	
	public function atualizarVotacaoConfronto($idConfronto, $idTime, $tipo) {
		
		if ($tipo == "Mandante") {
			
			$sql = "update confronto set votos_time1 = votos_time1+1 WHERE id_confronto = :id_confronto and id_time1 = :id_time";
		} else if ($tipo == "Visitante") {
			
			$sql = "update confronto set votos_time2 = votos_time2+1 WHERE id_confronto = :id_confronto and id_time2 = :id_time";	
		} else {
			
			return false;
		}
		
		try {
			
			$this->stmt = $this->conn->prepare($sql);
			$this->stmt->bindValue(":id_confronto", $idConfronto);
			$this->stmt->bindValue(":id_time", $idTime);
			
			$param = array(':id_confronto' => $idConfronto,':id_time' => $idTime);
			
			$this->stmt->execute($param);
			return true;
			
		} catch(PDOException $e) {
			
			throw new TimeException($e->getMessage());
		}
	}
	
	public function compartilharConfronto($idConfronto){
		//definir modo de compartilhamento e desenvolver fun��o.
	}
	
}